package general;

import java.io.Serializable;
import java.sql.Time;
import java.text.MessageFormat;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;

/**
 * Класс для описания возможных статусов флагов
 * 
 * @author Last G
 * 
 */
@Entity(name="flags")
public class Flag implements Serializable
{
	/**
	 * Generated
	 */
	private static final long serialVersionUID = -2955819626554440011L;
	@Id
	@GeneratedValue
	private int id;
	@Column(nullable=false, unique=true)
	private String flag;
	@Column
	private String exploitName;
	@Column
	private String team;
	@Column
	private String fromIp;
	@Column
	private Status status;
	@Column
	@DatabaseField(dataType=DataType.SERIALIZABLE)
	private Time captured;

	/**
	 * Default constructor that needed for ORM
	 */
	public Flag() {status = Status.New;};
	
	/**
	 * Констуктор флага, для того кто впервые вносит флаг в систему(пакет in)
	 * 
	 * @param flag
	 *            собственно строка флага
	 * @param exploitName
	 *            имя эксплоита собравшего флаг
	 * @param team
	 *            Команда у которой украден
	 * @param fromIp
	 *            IP на котором запущенн эксплоит(прислан флаг)
	 */
	public Flag(String flag, String exploitName, String team, String fromIp)
	{
		super();
		this.flag = flag;
		this.exploitName = exploitName;
		this.team = team;
		this.fromIp = fromIp;
		status = Status.New;
	}

	/**
	 * Конструктор для создания элемента класса Флаг, когда флаг достаётся из
	 * Storage. Данный конструктор являетя элементом ORM
	 * 
	 * @param id
	 *            идентификатор флага
	 * @param flag
	 *            собственно строка флага
	 * @param exploitName
	 *            имя эксплоита собравшего флаг
	 * @param team
	 *            Команда у которой украден
	 * @param fromIp
	 *            IP на котором запущенн эксплоит(прислан флаг)
	 * @param status
	 *            текущий статус флага
	 * @param captured
	 *            время добавления флага в базу
	 */
	public Flag(int id, String flag, String exploitName, String team,
			String fromIp, Status status, Time captured)
	{
		super();
		this.id = id;
		this.flag = flag;
		this.exploitName = exploitName;
		this.team = team;
		this.fromIp = fromIp;
		this.status = status;
		this.captured = captured;
	}
	@Override
	public boolean equals(Object obj)
	{
		if (obj != null && this.getClass().equals(obj.getClass()))
		{
			return this.flag.equals(((Flag) obj).flag);
		}
		return false;
	}

	/**
	 * @return статус флага
	 */
	public Status getStatus()
	{
		return status;
	}

	/**
	 * @param status
	 *            новый статус флага
	 */
	public void setStatus(Status status)
	{
		this.status = status;
	}

	/**
	 * @return время добавления флага в базу
	 */
	public Time getCaptured()
	{
		return captured;
	}

	/**
	 * @param captured
	 *            время добавления флага в базу
	 */
	public void setCaptured(Time captured)
	{
		this.captured = captured;
	}

	/**
	 * @return идентификатор
	 */
	public int getId()
	{
		return id;
	}

	/**
	 * @return собственно флаг
	 */
	public String getFlag()
	{
		return flag;
	}

	/**
	 * @return имя экслоита
	 */
	public String getExploitName()
	{
		return exploitName;
	}

	/**
	 * @return команда
	 */
	public String getTeam()
	{
		return team;
	}

	/**
	 * @return Ip эксплоита
	 */
	public String getFromIp()
	{
		return fromIp;
	}

	/**
	 * Set UniqID of flag in DB
	 * @param id ID
	 */
	public void setId(int id)
	{
		this.id = id;
	}

	/**
	 * Set flag, that was captured
	 * @param flag flag-string
	 */
	public void setFlag(String flag)
	{
		this.flag = flag;
	}
	/**
	 * Set Exploit Name thar captured flag
	 * @param exploitName name
	 */
	public void setExploitName(String exploitName)
	{
		this.exploitName = exploitName;
	}

	/**
	 * Set Name of team that was been attacked
	 * @param team name
	 */
	public void setTeam(String team)
	{
		this.team = team;
	}

	/**
	 * Set IP of EFclient
	 * @param fromIp IPAddress
	 */
	public void setFromIp(String fromIp)
	{
		this.fromIp = fromIp;
	}
	
	public String toString()
	{
		return MessageFormat.format("Flag {0} from team {1} with exploit {2} at {3}", new Object[]{flag, team, exploitName, captured});
	}
}
